﻿
/*
* UI界面类
* 用于显示界面和调用对应命令
* 由于界面之间存在继承关系，所以使用虚函数
* 调用单例模式的Manager类
*/

#pragma once
#include <string>
#include <vector>
#include "Manager.h"

// 界面基类
class UI
{
protected:
	int width;	// 界面宽度
	std::string title;	// 界面标题
	std::vector<std::string> options;	// 界面选项 存储字符串的动态数组//是一个声明了一个名为 options 的向量（vector）对象，其中存储了字符串（std::string）元素
	Manager* manager;	// 管理器

	// 生成界面选项说明
	static std::string makeOptionsName(const int& index, const std::string& option);

	// 显示一行星号
	void showLineStar();

	// 添加界面选项
	void addOption(const std::string& options);

	// 设置界面标题
	void setTitle(const std::string& title);

public:
	// 构造函数
	UI();

	// 显示界面
	virtual void showUI(bool isClear = true);

	// 运行界面
	virtual void run();

	// 返回调用提示
	virtual void backTip();

	// 调用对应命令
	virtual bool call(int index);
};

class mainUI : public UI//声明了一个新的类，名为 mainUI，它公开继承自基类 UI//mainUI 将继承基类 UI 的所有公有和受保护的成员
{
public:
	mainUI();
	bool call(int index) override;//重写了基类 UI 中的虚函数 call,使用 override 关键字明确表示这个函数意图覆盖基类中的虚函数
};//通过 override 关键字可以很容易地看出某个函数是否意图重写基类的虚函数

class maintenanceUI : public UI
{
public:
	maintenanceUI();
	bool call(int index) override;
};

class addBookUI : public UI
{
public:
	addBookUI();
	bool call(int index);
};

class showRecordUI : public UI
{
public:
	showRecordUI();
	bool call(int index);
};

class searchUI : public UI
{
public:
	searchUI();
	bool call(int index);
};

class borrowAndReturnUI : public UI
{
private:
	std::string borrowerID;
public:
	borrowAndReturnUI();
	bool call(int index);

	void showUI(bool isClear);
};

class displayUI : public UI
{
public:
	displayUI();
	bool call(int index);
};